package com.ai.common.core.pager.model;

import java.util.ArrayList;

import com.ai.common.core.base.DTO;
import com.ai.common.core.enums.DbTypes;
import com.ai.common.core.enums.DbTypes.DbTypeEnum;
import com.ai.common.core.pager.service.IPagerService;
import com.ai.common.exception.AlikAssert;
import com.ai.common.model.Pagination;

/**
 * 分页辅助类
 */
public class PagerUtil {

	/**
	 * 分页大小
	 */
	public static final int pageSize = 20;

	/**
	 * 数据库类型
	 */
	private static final String dbtype = DbTypeEnum.MYSQL.getValue();

	/**
	 * 分页
	 * 
	 * @param pager
	 * @param paramMap
	 * @param dbtype
	 * @return
	 * @throws Exception
	 */
	public static <T> Pagination<T> getPagination(IPagerService<T> pagerService,
			DTO dto) throws Exception {

		AlikAssert.isNotNull(dto, "the parameter DTO is can not be null !!!!");

		dto.setDbtype(dbtype);
		dto.setPage((dto.getPage() == null) ? 1 : dto.getPage());
		if (dto.getRows() == null || dto.getRows() > 100) {
			dto.setRows(PagerUtil.pageSize);
		}

		Pagination<T> pagination = new Pagination<T>();
		pagination.setTotal(pagerService.queryCount(dto));

		int startIndex = (dto.getPage() - 1) * dto.getRows() + 1;
		int endIndex = startIndex + dto.getRows() - 1;

		if (DbTypes.isMysql(dbtype)) {
			if (startIndex <= 0) {
				dto.setRowstartindex(0);
				dto.setRowendindex(0);
			} else {
				dto.setRowstartindex(startIndex - 1);
				dto.setRowendindex(dto.getRows());
			}
		} else {
			dto.setRowstartindex(startIndex);
			dto.setRowendindex(endIndex);
		}
		if (pagination.getTotal() >= 1) {
			pagination.setRows(pagerService.queryList(dto));
		} else {
			pagination.setRows(new ArrayList<T>());
		}
		return pagination;
	}

	/**
	 * 分页
	 * 
	 * @param pager
	 * @param paramMap
	 * @param dbtype
	 * @return
	 * @throws Exception
	 */
	public static <T> PagerModel<T> getPagerModel(IPagerService<T> pagerService,
			DTO dto) throws Exception {
		AlikAssert.isNotNull(dto, "the parameter DTO is can not be null !!!!");
		PagerModel<T> pagerModel = new PagerModel<T>();
		if (dto.getPage() == null) {
			dto.setPage(1);
		}
		if (dto.getRows() == null || dto.getRows() > 100) {
			dto.setRows(PagerUtil.pageSize);
		}
		dto.setDbtype(dbtype);

		pagerModel.setPageSize(dto.getRows());
		pagerModel.setCurrentPage(dto.getPage());
		pagerModel.setCount(pagerService.queryCount(dto));
		pagerModel.setStartIndex(
				(pagerModel.getCurrentPage() - 1) * pagerModel.getPageSize()
						+ 1);
		pagerModel.setEndIndex(
				pagerModel.getStartIndex() + pagerModel.getPageSize() - 1);
		pagerModel
				.setPageCount(
						(pagerModel.getCount() % pagerModel.getPageSize() == 0)
								? pagerModel.getCount() / pagerModel
										.getPageSize()
								: pagerModel.getCount()
										/ pagerModel.getPageSize() + 1);
		if (pagerModel.getCurrentPage() >= pagerModel.getPageCount()) {
			pagerModel.setCurrentPage(pagerModel.getPageCount());
			pagerModel.setNextPage(pagerModel.getPageCount());
		} else {
			pagerModel.setNextPage(pagerModel.getCurrentPage() + 1);
		}
		if (pagerModel.getPriviousPage() == null
				|| pagerModel.getPriviousPage() <= 1) {
			pagerModel.setPriviousPage(1);
		} else {
			pagerModel.setPriviousPage(pagerModel.getCurrentPage() - 1);
		}

		if (DbTypes.isMysql(dbtype)) {
			if (pagerModel.getStartIndex() <= 0) {
				dto.setRowstartindex(0);
				dto.setRowendindex(0);
			} else {
				dto.setRowstartindex(pagerModel.getStartIndex() - 1);
				dto.setRowendindex(pagerModel.getPageSize());
			}
		} else {
			dto.setRowstartindex(pagerModel.getStartIndex());
			dto.setRowendindex(pagerModel.getEndIndex());
		}
		if (pagerModel.getCount() >= 1) {
			pagerModel.setDataList(pagerService.queryList(dto));
		} else {
			pagerModel.setDataList(new ArrayList<T>());
		}
		return pagerModel;
	}

}
